{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "s_qNSzzyaCbD"
   },
   "source": [
    "##### Copyright 2019 The TensorFlow Authors.\n",
    "\n",
    "Licensed under the Apache License, Version 2.0 (the \"License\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "jmjh290raIky"
   },
   "outputs": [],
   "source": [
    "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "# https://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "J0Qjg6vuaHNt"
   },
   "source": [
    "# Neural Machine Translation with Attention"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "AOpGoE2T-YXS"
   },
   "source": [
    "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://www.tensorflow.org/alpha/tutorials/sequences/nmt_with_attention\">\n",
    "    <img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />\n",
    "    View on TensorFlow.org</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/sequences/nmt_with_attention.ipynb\">\n",
    "    <img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />\n",
    "    Run in Google Colab</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://github.com/tensorflow/docs/blob/master/site/en/r2/tutorials/sequences/nmt_with_attention.ipynb\">\n",
    "    <img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />\n",
    "    View source on GitHub</a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "CiwtNgENbx2g"
   },
   "source": [
    "This notebook trains a sequence to sequence (seq2seq) model for Spanish to English translation. This is an advanced example that assumes some knowledge of sequence to sequence models.\n",
    "\n",
    "After training the model in this notebook, you will be able to input a Spanish sentence, such as *\"¿todavia estan en casa?\"*, and return the English translation: *\"are you still at home?\"*\n",
    "\n",
    "The translation quality is reasonable for a toy example, but the generated attention plot is perhaps more interesting. This shows which parts of the input sentence has the model's attention while translating:\n",
    "\n",
    "<img src=\"https://tensorflow.org/images/spanish-english.png\" alt=\"spanish-english attention plot\">\n",
    "\n",
    "Note: This example takes approximately 10 mintues to run on a single P100 GPU."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 34
    },
    "colab_type": "code",
    "id": "tnxXKDjq3jEL",
    "outputId": "f9b3f15f-89cf-4ea4-c2a4-8da42f851d1a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.13.1\n"
     ]
    }
   ],
   "source": [
    "from __future__ import absolute_import, division, print_function\n",
    "\n",
    "!pip install tensorflow-gpu==2.0.0-alpha0\n",
    "import tensorflow as tf\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "import unicodedata\n",
    "import re\n",
    "import numpy as np\n",
    "import os\n",
    "import io\n",
    "import time\n",
    "\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "wfodePkj3jEa"
   },
   "source": [
    "## Download and prepare the dataset\n",
    "\n",
    "We'll use a language dataset provided by http://www.manythings.org/anki/. This dataset contains language translation pairs in the format:\n",
    "\n",
    "```\n",
    "May I borrow this book?\t¿Puedo tomar prestado este libro?\n",
    "```\n",
    "\n",
    "There are a variety of languages available, but we'll use the English-Spanish dataset. For convenience, we've hosted a copy of this dataset on Google Cloud, but you can also download your own copy. After downloading the dataset, here are the steps we'll take to prepare the data:\n",
    "\n",
    "1. Add a *start* and *end* token to each sentence.\n",
    "2. Clean the sentences by removing special characters.\n",
    "3. Create a word index and reverse word index (dictionaries mapping from word → id and id → word).\n",
    "4. Pad each sentence to a maximum length."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "kRVATYOgJs1b"
   },
   "outputs": [],
   "source": [
    "# Download the file\n",
    "path_to_zip = tf.keras.utils.get_file(\n",
    "    'spa-eng.zip', origin='http://storage.googleapis.com/download.tensorflow.org/data/spa-eng.zip', \n",
    "    extract=True)\n",
    "\n",
    "path_to_file = os.path.dirname(path_to_zip)+\"/spa-eng/spa.txt\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "rd0jw-eC3jEh"
   },
   "outputs": [],
   "source": [
    "# Converts the unicode file to ascii\n",
    "def unicode_to_ascii(s):\n",
    "    return ''.join(c for c in unicodedata.normalize('NFD', s)\n",
    "        if unicodedata.category(c) != 'Mn')\n",
    "\n",
    "\n",
    "def preprocess_sentence(w):\n",
    "    w = unicode_to_ascii(w.lower().strip())\n",
    "    \n",
    "    # creating a space between a word and the punctuation following it\n",
    "    # eg: \"he is a boy.\" => \"he is a boy .\" \n",
    "    # Reference:- https://stackoverflow.com/questions/3645931/python-padding-punctuation-with-white-spaces-keeping-punctuation\n",
    "    w = re.sub(r\"([?.!,¿])\", r\" \\1 \", w)\n",
    "    w = re.sub(r'[\" \"]+', \" \", w)\n",
    "    \n",
    "    # replacing everything with space except (a-z, A-Z, \".\", \"?\", \"!\", \",\")\n",
    "    w = re.sub(r\"[^a-zA-Z?.!,¿]+\", \" \", w)\n",
    "    \n",
    "    w = w.rstrip().strip()\n",
    "    \n",
    "    # adding a start and an end token to the sentence\n",
    "    # so that the model know when to start and stop predicting.\n",
    "    w = '<start> ' + w + ' <end>'\n",
    "    return w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 51
    },
    "colab_type": "code",
    "id": "opI2GzOt479E",
    "outputId": "e84370d2-ebd1-4c23-eaca-2de7db023e5e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<start> may i borrow this book ? <end>\n",
      "<start> ¿ puedo tomar prestado este libro ? <end>\n"
     ]
    }
   ],
   "source": [
    "en_sentence = u\"May I borrow this book?\"\n",
    "sp_sentence = u\"¿Puedo tomar prestado este libro?\"\n",
    "print(preprocess_sentence(en_sentence))\n",
    "print(preprocess_sentence(sp_sentence).encode('utf-8'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "OHn4Dct23jEm"
   },
   "outputs": [],
   "source": [
    "# 1. Remove the accents\n",
    "# 2. Clean the sentences\n",
    "# 3. Return word pairs in the format: [ENGLISH, SPANISH]\n",
    "def create_dataset(path, num_examples):\n",
    "    lines = io.open(path, encoding='UTF-8').read().strip().split('\\n')\n",
    "    \n",
    "    word_pairs = [[preprocess_sentence(w) for w in l.split('\\t')]  for l in lines[:num_examples]]\n",
    "    \n",
    "    return zip(*word_pairs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 71
    },
    "colab_type": "code",
    "id": "cTbSbBz55QtF",
    "outputId": "f9a1b944-89d6-4c6e-c20d-fa5ec6eb76db"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<start> if you want to sound like a native speaker , you must be willing to practice saying the same sentence over and over in the same way that banjo players practice the same phrase over and over until they can play it correctly and at the desired tempo . <end>\n",
      "<start> si quieres sonar como un hablante nativo , debes estar dispuesto a practicar diciendo la misma frase una y otra vez de la misma manera en que un musico de banjo practica el mismo fraseo una y otra vez hasta que lo puedan tocar correctamente y en el tiempo esperado . <end>\n"
     ]
    }
   ],
   "source": [
    "en, sp = create_dataset(path_to_file, None)\n",
    "print(en[-1])\n",
    "print(sp[-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "OmMZQpdO60dt"
   },
   "outputs": [],
   "source": [
    "def max_length(tensor):\n",
    "    return max(len(t) for t in tensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "bIOn8RCNDJXG"
   },
   "outputs": [],
   "source": [
    "def tokenize(lang):\n",
    "  lang_tokenizer = tf.keras.preprocessing.text.Tokenizer(\n",
    "      filters='')\n",
    "  lang_tokenizer.fit_on_texts(lang)\n",
    "  \n",
    "  tensor = lang_tokenizer.texts_to_sequences(lang)\n",
    "  \n",
    "  tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor,\n",
    "                                                         padding='post')\n",
    "  \n",
    "  return tensor, lang_tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "eAY9k49G3jE_"
   },
   "outputs": [],
   "source": [
    "def load_dataset(path, num_examples=None):\n",
    "    # creating cleaned input, output pairs\n",
    "    targ_lang, inp_lang = create_dataset(path, num_examples)\n",
    "\n",
    "    input_tensor, inp_lang_tokenizer = tokenize(inp_lang)\n",
    "    target_tensor, targ_lang_tokenizer = tokenize(targ_lang)\n",
    "\n",
    "    return input_tensor, target_tensor, inp_lang_tokenizer, targ_lang_tokenizer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "GOi42V79Ydlr"
   },
   "source": [
    "### Limit the size of the dataset to experiment faster (optional)\n",
    "\n",
    "Training on the complete dataset of >100,000 sentences will take a long time. To train faster, we can limit the size of the dataset to 30,000 sentences (of course, translation quality degrades with less data):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "cnxC7q-j3jFD"
   },
   "outputs": [],
   "source": [
    "# Try experimenting with the size of that dataset\n",
    "num_examples = 30000\n",
    "input_tensor, target_tensor, inp_lang, targ_lang = load_dataset(path_to_file, num_examples)\n",
    "\n",
    "# Calculate max_length of the target tensors\n",
    "max_length_targ, max_length_inp = max_length(target_tensor), max_length(input_tensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 34
    },
    "colab_type": "code",
    "id": "4QILQkOs3jFG",
    "outputId": "f2d08080-4911-4c0d-b7df-17de6a6cbfba"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(24000, 24000, 6000, 6000)"
      ]
     },
     "execution_count": 0,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Creating training and validation sets using an 80-20 split\n",
    "input_tensor_train, input_tensor_val, target_tensor_train, target_tensor_val = train_test_split(input_tensor, target_tensor, test_size=0.2)\n",
    "\n",
    "# Show length\n",
    "len(input_tensor_train), len(target_tensor_train), len(input_tensor_val), len(target_tensor_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "lJPmLZGMeD5q"
   },
   "outputs": [],
   "source": [
    "def convert(lang, tensor):\n",
    "  for t in tensor:\n",
    "    if t!=0:\n",
    "      print (\"%d ----> %s\" % (t, lang.index_word[t]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 340
    },
    "colab_type": "code",
    "id": "VXukARTDd7MT",
    "outputId": "0379abe4-bdd1-4faf-8dbe-659ff0d4f81d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input Language; index to word mapping\n",
      "1 ----> <start>\n",
      "431 ----> vuestro\n",
      "92 ----> perro\n",
      "7 ----> es\n",
      "36 ----> muy\n",
      "189 ----> grande\n",
      "3 ----> .\n",
      "2 ----> <end>\n",
      "\n",
      "Target Language; index to word mapping\n",
      "1 ----> <start>\n",
      "31 ----> your\n",
      "104 ----> dog\n",
      "8 ----> is\n",
      "48 ----> very\n",
      "155 ----> big\n",
      "3 ----> .\n",
      "2 ----> <end>\n"
     ]
    }
   ],
   "source": [
    "print (\"Input Language; index to word mapping\")\n",
    "convert(inp_lang, input_tensor_train[0])\n",
    "print ()\n",
    "print (\"Target Language; index to word mapping\")\n",
    "convert(targ_lang, target_tensor_train[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "rgCLkfv5uO3d"
   },
   "source": [
    "### Create a tf.data dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "TqHsArVZ3jFS"
   },
   "outputs": [],
   "source": [
    "BUFFER_SIZE = len(input_tensor_train)\n",
    "BATCH_SIZE = 64\n",
    "steps_per_epoch = len(input_tensor_train)//BATCH_SIZE\n",
    "embedding_dim = 256\n",
    "units = 1024\n",
    "vocab_inp_size = len(inp_lang.word_index)+1\n",
    "vocab_tar_size = len(targ_lang.word_index)+1\n",
    "\n",
    "dataset = tf.data.Dataset.from_tensor_slices((input_tensor_train, target_tensor_train)).shuffle(BUFFER_SIZE)\n",
    "dataset = dataset.batch(BATCH_SIZE, drop_remainder=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 34
    },
    "colab_type": "code",
    "id": "qc6-NK1GtWQt",
    "outputId": "cdd21acd-fea7-4415-bd1c-0fea35ddf619"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(TensorShape([64, 16]), TensorShape([64, 11]))"
      ]
     },
     "execution_count": 0,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "example_input_batch, example_target_batch = next(iter(dataset))\n",
    "example_input_batch.shape, example_target_batch.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "TNfHIF71ulLu"
   },
   "source": [
    "## Write the encoder and decoder model\n",
    "\n",
    "Here, we'll implement an encoder-decoder model with attention which you can read about in the TensorFlow [Neural Machine Translation (seq2seq) tutorial](https://www.tensorflow.org/tutorials/seq2seq). This example uses a more recent set of APIs. This notebook implements the [attention equations](https://www.tensorflow.org/tutorials/seq2seq#background_on_the_attention_mechanism) from the seq2seq tutorial. The following diagram shows that each input words is assigned a weight by the attention mechanism which is then used by the decoder to predict the next word in the sentence.\n",
    "\n",
    "<img src=\"https://www.tensorflow.org/images/seq2seq/attention_mechanism.jpg\" width=\"500\" alt=\"attention mechanism\">\n",
    "\n",
    "The input is put through an encoder model which gives us the encoder output of shape *(batch_size, max_length, hidden_size)* and the encoder hidden state of shape *(batch_size, hidden_size)*. \n",
    "\n",
    "Here are the equations that are implemented:\n",
    "\n",
    "<img src=\"https://www.tensorflow.org/images/seq2seq/attention_equation_0.jpg\" alt=\"attention equation 0\" width=\"800\">\n",
    "<img src=\"https://www.tensorflow.org/images/seq2seq/attention_equation_1.jpg\" alt=\"attention equation 1\" width=\"800\">\n",
    "\n",
    "We're using *Bahdanau attention*. Lets decide on notation before writing the simplified form:\n",
    "\n",
    "* FC = Fully connected (dense) layer\n",
    "* EO = Encoder output\n",
    "* H = hidden state\n",
    "* X = input to the decoder\n",
    "\n",
    "And the pseudo-code:\n",
    "\n",
    "* `score = FC(tanh(FC(EO) + FC(H)))`\n",
    "* `attention weights = softmax(score, axis = 1)`. Softmax by default is applied on the last axis but here we want to apply it on the *1st axis*, since the shape of score is *(batch_size, max_length, hidden_size)*. `Max_length` is the length of our input. Since we are trying to assign a weight to each input, softmax should be applied on that axis.\n",
    "* `context vector = sum(attention weights * EO, axis = 1)`. Same reason as above for choosing axis as 1.\n",
    "* `embedding output` = The input to the decoder X is passed through an embedding layer.\n",
    "* `merged vector = concat(embedding output, context vector)`\n",
    "* This merged vector is then given to the GRU\n",
    "  \n",
    "The shapes of all the vectors at each step have been specified in the comments in the code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nZ2rI24i3jFg"
   },
   "outputs": [],
   "source": [
    "class Encoder(tf.keras.Model):\n",
    "  def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):\n",
    "    super(Encoder, self).__init__()\n",
    "    self.batch_sz = batch_sz\n",
    "    self.enc_units = enc_units\n",
    "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
    "    self.gru = tf.keras.layers.GRU(self.enc_units, \n",
    "                                   return_sequences=True, \n",
    "                                   return_state=True, \n",
    "                                   recurrent_initializer='glorot_uniform')\n",
    "\n",
    "  def call(self, x, hidden):\n",
    "    x = self.embedding(x)\n",
    "    output, state = self.gru(x, initial_state = hidden)        \n",
    "    return output, state\n",
    "\n",
    "  def initialize_hidden_state(self):\n",
    "    return tf.zeros((self.batch_sz, self.enc_units))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 51
    },
    "colab_type": "code",
    "id": "60gSVh05Jl6l",
    "outputId": "9cc611a5-60af-4606-a162-4afc43a94654"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Encoder output shape: (batch size, sequence length, units) (64, 16, 1024)\n",
      "Encoder Hidden state shape: (batch size, units) (64, 1024)\n"
     ]
    }
   ],
   "source": [
    "encoder = Encoder(vocab_inp_size, embedding_dim, units, BATCH_SIZE)\n",
    "\n",
    "# sample input\n",
    "sample_hidden = encoder.initialize_hidden_state()\n",
    "sample_output, sample_hidden = encoder(example_input_batch, sample_hidden)\n",
    "print ('Encoder output shape: (batch size, sequence length, units) {}'.format(sample_output.shape))\n",
    "print ('Encoder Hidden state shape: (batch size, units) {}'.format(sample_hidden.shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "umohpBN2OM94"
   },
   "outputs": [],
   "source": [
    "class BahdanauAttention(tf.keras.Model):\n",
    "  def __init__(self, units):\n",
    "    super(BahdanauAttention, self).__init__()\n",
    "    self.W1 = tf.keras.layers.Dense(units)\n",
    "    self.W2 = tf.keras.layers.Dense(units)\n",
    "    self.V = tf.keras.layers.Dense(1)\n",
    "  \n",
    "  def call(self, query, values):\n",
    "    # hidden shape == (batch_size, hidden size)\n",
    "    # hidden_with_time_axis shape == (batch_size, 1, hidden size)\n",
    "    # we are doing this to perform addition to calculate the score\n",
    "    hidden_with_time_axis = tf.expand_dims(query, 1)\n",
    "\n",
    "    # score shape == (batch_size, max_length, hidden_size)\n",
    "    score = self.V(tf.nn.tanh(\n",
    "        self.W1(values) + self.W2(hidden_with_time_axis)))\n",
    "\n",
    "    # attention_weights shape == (batch_size, max_length, 1)\n",
    "    # we get 1 at the last axis because we are applying score to self.V\n",
    "    attention_weights = tf.nn.softmax(score, axis=1)\n",
    "\n",
    "    # context_vector shape after sum == (batch_size, hidden_size)\n",
    "    context_vector = attention_weights * values\n",
    "    context_vector = tf.reduce_sum(context_vector, axis=1)\n",
    "    \n",
    "    return context_vector, attention_weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 51
    },
    "colab_type": "code",
    "id": "k534zTHiDjQU",
    "outputId": "6c6af4b0-8911-4ae4-8352-0163400c0482"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Attention result shape: (batch size, units) (64, 1024)\n",
      "Attention weights shape: (batch_size, sequence_length, 1) (64, 16, 1)\n"
     ]
    }
   ],
   "source": [
    "attention_layer = BahdanauAttention(10)\n",
    "attention_result, attention_weights = attention_layer(sample_hidden, sample_output)\n",
    "\n",
    "print(\"Attention result shape: (batch size, units) {}\".format(attention_result.shape))\n",
    "print(\"Attention weights shape: (batch_size, sequence_length, 1) {}\".format(attention_weights.shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "yJ_B3mhW3jFk"
   },
   "outputs": [],
   "source": [
    "class Decoder(tf.keras.Model):\n",
    "  def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):\n",
    "    super(Decoder, self).__init__()\n",
    "    self.batch_sz = batch_sz\n",
    "    self.dec_units = dec_units\n",
    "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
    "    self.gru = tf.keras.layers.GRU(self.dec_units, \n",
    "                                   return_sequences=True, \n",
    "                                   return_state=True, \n",
    "                                   recurrent_initializer='glorot_uniform')\n",
    "    self.fc = tf.keras.layers.Dense(vocab_size)\n",
    "\n",
    "    # used for attention\n",
    "    self.attention = BahdanauAttention(self.dec_units)\n",
    "\n",
    "  def call(self, x, hidden, enc_output):\n",
    "    # enc_output shape == (batch_size, max_length, hidden_size)\n",
    "    context_vector, attention_weights = self.attention(hidden, enc_output)\n",
    "\n",
    "    # x shape after passing through embedding == (batch_size, 1, embedding_dim)\n",
    "    x = self.embedding(x)\n",
    "\n",
    "    # x shape after concatenation == (batch_size, 1, embedding_dim + hidden_size)\n",
    "    x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)\n",
    "\n",
    "    # passing the concatenated vector to the GRU\n",
    "    output, state = self.gru(x)\n",
    "\n",
    "    # output shape == (batch_size * 1, hidden_size)\n",
    "    output = tf.reshape(output, (-1, output.shape[2]))\n",
    "\n",
    "    # output shape == (batch_size, vocab)\n",
    "    x = self.fc(output)\n",
    "\n",
    "    return x, state, attention_weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 34
    },
    "colab_type": "code",
    "id": "P5UY8wko3jFp",
    "outputId": "166c1b8d-771e-4d8f-92e4-120c1fd274d9"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Decoder output shape: (batch_size, vocab size) (64, 4935)\n"
     ]
    }
   ],
   "source": [
    "decoder = Decoder(vocab_tar_size, embedding_dim, units, BATCH_SIZE)\n",
    "\n",
    "sample_decoder_output, _, _ = decoder(tf.random.uniform((64, 1)), \n",
    "                                      sample_hidden, sample_output)\n",
    "\n",
    "print ('Decoder output shape: (batch_size, vocab size) {}'.format(sample_decoder_output.shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "_ch_71VbIRfK"
   },
   "source": [
    "## Define the optimizer and the loss function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "WmTHr5iV3jFr"
   },
   "outputs": [],
   "source": [
    "optimizer = tf.keras.optimizers.Adam()\n",
    "loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)\n",
    "\n",
    "def loss_function(real, pred):\n",
    "  mask = tf.math.logical_not(tf.math.equal(real, 0))\n",
    "  loss_ = loss_object(real, pred)\n",
    "\n",
    "  mask = tf.cast(mask, dtype=loss_.dtype)\n",
    "  loss_ *= mask\n",
    "  \n",
    "  return tf.reduce_mean(loss_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "DMVWzzsfNl4e"
   },
   "source": [
    "## Checkpoints (Object-based saving)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Zj8bXQTgNwrF"
   },
   "outputs": [],
   "source": [
    "checkpoint_dir = './training_checkpoints'\n",
    "checkpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\n",
    "checkpoint = tf.train.Checkpoint(optimizer=optimizer,\n",
    "                                 encoder=encoder,\n",
    "                                 decoder=decoder)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "hpObfY22IddU"
   },
   "source": [
    "## Training\n",
    "\n",
    "1. Pass the *input* through the *encoder* which return *encoder output* and the *encoder hidden state*.\n",
    "2. The encoder output, encoder hidden state and the decoder input (which is the *start token*) is passed to the decoder.\n",
    "3. The decoder returns the *predictions* and the *decoder hidden state*.\n",
    "4. The decoder hidden state is then passed back into the model and the predictions are used to calculate the loss.\n",
    "5. Use *teacher forcing* to decide the next input to the decoder.\n",
    "6. *Teacher forcing* is the technique where the *target word* is passed as the *next input* to the decoder.\n",
    "7. The final step is to calculate the gradients and apply it to the optimizer and backpropagate."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "sC9ArXSsVfqn"
   },
   "outputs": [],
   "source": [
    "@tf.function\n",
    "def train_step(inp, targ, enc_hidden):\n",
    "  loss = 0\n",
    "        \n",
    "  with tf.GradientTape() as tape:\n",
    "    enc_output, enc_hidden = encoder(inp, enc_hidden)\n",
    "\n",
    "    dec_hidden = enc_hidden\n",
    "\n",
    "    dec_input = tf.expand_dims([targ_lang.word_index['<start>']] * BATCH_SIZE, 1)       \n",
    "\n",
    "    # Teacher forcing - feeding the target as the next input\n",
    "    for t in range(1, targ.shape[1]):\n",
    "      # passing enc_output to the decoder\n",
    "      predictions, dec_hidden, _ = decoder(dec_input, dec_hidden, enc_output)\n",
    "\n",
    "      loss += loss_function(targ[:, t], predictions)\n",
    "\n",
    "      # using teacher forcing\n",
    "      dec_input = tf.expand_dims(targ[:, t], 1)\n",
    "\n",
    "  batch_loss = (loss / int(targ.shape[1]))\n",
    "\n",
    "  variables = encoder.trainable_variables + decoder.trainable_variables\n",
    "\n",
    "  gradients = tape.gradient(loss, variables)\n",
    "\n",
    "  optimizer.apply_gradients(zip(gradients, variables))\n",
    "  \n",
    "  return batch_loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 1601
    },
    "colab_type": "code",
    "id": "ddefjBMa3jF0",
    "outputId": "7a34b1ed-7488-4489-9a64-c4829fc63ead"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": []
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1 Batch 0 Loss 4.5657\n",
      "Epoch 1 Batch 100 Loss 2.1792\n",
      "Epoch 1 Batch 200 Loss 1.7583\n",
      "Epoch 1 Batch 300 Loss 1.7384\n",
      "Epoch 1 Loss 1.9949\n",
      "Time taken for 1 epoch 49.0501441956 sec\n",
      "\n",
      "Epoch 2 Batch 0 Loss 1.5181\n",
      "Epoch 2 Batch 100 Loss 1.4801\n",
      "Epoch 2 Batch 200 Loss 1.2197\n",
      "Epoch 2 Batch 300 Loss 1.2561\n",
      "Epoch 2 Loss 1.3435\n",
      "Time taken for 1 epoch 34.9393060207 sec\n",
      "\n",
      "Epoch 3 Batch 0 Loss 1.0709\n",
      "Epoch 3 Batch 100 Loss 1.0403\n",
      "Epoch 3 Batch 200 Loss 0.7950\n",
      "Epoch 3 Batch 300 Loss 0.8709\n",
      "Epoch 3 Loss 0.9174\n",
      "Time taken for 1 epoch 34.288944006 sec\n",
      "\n",
      "Epoch 4 Batch 0 Loss 0.7071\n",
      "Epoch 4 Batch 100 Loss 0.6888\n",
      "Epoch 4 Batch 200 Loss 0.4978\n",
      "Epoch 4 Batch 300 Loss 0.5841\n",
      "Epoch 4 Loss 0.6134\n",
      "Time taken for 1 epoch 35.33512187 sec\n",
      "\n",
      "Epoch 5 Batch 0 Loss 0.4685\n",
      "Epoch 5 Batch 100 Loss 0.4926\n",
      "Epoch 5 Batch 200 Loss 0.3000\n",
      "Epoch 5 Batch 300 Loss 0.3866\n",
      "Epoch 5 Loss 0.4136\n",
      "Time taken for 1 epoch 34.1087429523 sec\n",
      "\n",
      "Epoch 6 Batch 0 Loss 0.3144\n",
      "Epoch 6 Batch 100 Loss 0.3042\n",
      "Epoch 6 Batch 200 Loss 0.1984\n",
      "Epoch 6 Batch 300 Loss 0.2658\n",
      "Epoch 6 Loss 0.2875\n",
      "Time taken for 1 epoch 35.1170010567 sec\n",
      "\n",
      "Epoch 7 Batch 0 Loss 0.2284\n",
      "Epoch 7 Batch 100 Loss 0.2275\n",
      "Epoch 7 Batch 200 Loss 0.1428\n",
      "Epoch 7 Batch 300 Loss 0.1976\n",
      "Epoch 7 Loss 0.2032\n",
      "Time taken for 1 epoch 33.9758181572 sec\n",
      "\n",
      "Epoch 8 Batch 0 Loss 0.1724\n",
      "Epoch 8 Batch 100 Loss 0.1635\n",
      "Epoch 8 Batch 200 Loss 0.0983\n",
      "Epoch 8 Batch 300 Loss 0.1408\n",
      "Epoch 8 Loss 0.1461\n",
      "Time taken for 1 epoch 35.9068500996 sec\n",
      "\n",
      "Epoch 9 Batch 0 Loss 0.1353\n",
      "Epoch 9 Batch 100 Loss 0.1123\n",
      "Epoch 9 Batch 200 Loss 0.0888\n",
      "Epoch 9 Batch 300 Loss 0.0953\n",
      "Epoch 9 Loss 0.1107\n",
      "Time taken for 1 epoch 34.0839440823 sec\n",
      "\n",
      "Epoch 10 Batch 0 Loss 0.1103\n",
      "Epoch 10 Batch 100 Loss 0.0954\n",
      "Epoch 10 Batch 200 Loss 0.0654\n",
      "Epoch 10 Batch 300 Loss 0.0824\n",
      "Epoch 10 Loss 0.0885\n",
      "Time taken for 1 epoch 35.4287509918 sec\n",
      "\n"
     ]
    }
   ],
   "source": [
    "EPOCHS = 10\n",
    "\n",
    "for epoch in range(EPOCHS):\n",
    "  start = time.time()\n",
    "\n",
    "  enc_hidden = encoder.initialize_hidden_state()\n",
    "  total_loss = 0\n",
    "\n",
    "  for (batch, (inp, targ)) in enumerate(dataset.take(steps_per_epoch)):\n",
    "    batch_loss = train_step(inp, targ, enc_hidden)\n",
    "    total_loss += batch_loss\n",
    "\n",
    "    if batch % 100 == 0:\n",
    "        print('Epoch {} Batch {} Loss {:.4f}'.format(epoch + 1,\n",
    "                                                     batch,\n",
    "                                                     batch_loss.numpy()))\n",
    "  # saving (checkpoint) the model every 2 epochs\n",
    "  if (epoch + 1) % 2 == 0:\n",
    "    checkpoint.save(file_prefix = checkpoint_prefix)\n",
    "\n",
    "  print('Epoch {} Loss {:.4f}'.format(epoch + 1,\n",
    "                                      total_loss / steps_per_epoch))\n",
    "  print('Time taken for 1 epoch {} sec\\n'.format(time.time() - start))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "mU3Ce8M6I3rz"
   },
   "source": [
    "## Translate\n",
    "\n",
    "* The evaluate function is similar to the training loop, except we don't use *teacher forcing* here. The input to the decoder at each time step is its previous predictions along with the hidden state and the encoder output.\n",
    "* Stop predicting when the model predicts the *end token*.\n",
    "* And store the *attention weights for every time step*.\n",
    "\n",
    "Note: The encoder output is calculated only once for one input."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "EbQpyYs13jF_"
   },
   "outputs": [],
   "source": [
    "def evaluate(sentence):\n",
    "    attention_plot = np.zeros((max_length_targ, max_length_inp))\n",
    "    \n",
    "    sentence = preprocess_sentence(sentence)\n",
    "\n",
    "    inputs = [inp_lang.word_index[i] for i in sentence.split(' ')]\n",
    "    inputs = tf.keras.preprocessing.sequence.pad_sequences([inputs], \n",
    "                                                           maxlen=max_length_inp, \n",
    "                                                           padding='post')\n",
    "    inputs = tf.convert_to_tensor(inputs)\n",
    "    \n",
    "    result = ''\n",
    "\n",
    "    hidden = [tf.zeros((1, units))]\n",
    "    enc_out, enc_hidden = encoder(inputs, hidden)\n",
    "\n",
    "    dec_hidden = enc_hidden\n",
    "    dec_input = tf.expand_dims([targ_lang.word_index['<start>']], 0)\n",
    "    \n",
    "    for t in range(max_length_targ):\n",
    "        predictions, dec_hidden, attention_weights = decoder(dec_input, \n",
    "                                                             dec_hidden, \n",
    "                                                             enc_out)\n",
    "        \n",
    "        # storing the attention weights to plot later on\n",
    "        attention_weights = tf.reshape(attention_weights, (-1, ))\n",
    "        attention_plot[t] = attention_weights.numpy()\n",
    "\n",
    "        predicted_id = tf.argmax(predictions[0]).numpy()\n",
    "\n",
    "        result += targ_lang.index_word[predicted_id] + ' '\n",
    "\n",
    "        if targ_lang.index_word[predicted_id] == '<end>':\n",
    "            return result, sentence, attention_plot\n",
    "        \n",
    "        # the predicted ID is fed back into the model\n",
    "        dec_input = tf.expand_dims([predicted_id], 0)\n",
    "\n",
    "    return result, sentence, attention_plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "s5hQWlbN3jGF"
   },
   "outputs": [],
   "source": [
    "# function for plotting the attention weights\n",
    "def plot_attention(attention, sentence, predicted_sentence):\n",
    "    fig = plt.figure(figsize=(10,10))\n",
    "    ax = fig.add_subplot(1, 1, 1)\n",
    "    ax.matshow(attention, cmap='viridis')\n",
    "    \n",
    "    fontdict = {'fontsize': 14}\n",
    "    \n",
    "    ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n",
    "    ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n",
    "\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "sl9zUHzg3jGI"
   },
   "outputs": [],
   "source": [
    "def translate(sentence):\n",
    "    result, sentence, attention_plot = evaluate(sentence)\n",
    "        \n",
    "    print('Input: %s' % (sentence).encode('utf-8'))\n",
    "    print('Predicted translation: {}'.format(result))\n",
    "    \n",
    "    attention_plot = attention_plot[:len(result.split(' ')), :len(sentence.split(' '))]\n",
    "    plot_attention(attention_plot, sentence.split(' '), result.split(' '))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "n250XbnjOaqP"
   },
   "source": [
    "## Restore the latest checkpoint and test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 34
    },
    "colab_type": "code",
    "id": "UJpT9D5_OgP6",
    "outputId": "4a534e70-017d-4f2e-c572-3072c0341508"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
      ]
     },
     "execution_count": 0,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# restoring the latest checkpoint in checkpoint_dir\n",
    "checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 689
    },
    "colab_type": "code",
    "id": "WrAM0FDomq3E",
    "outputId": "1020b91e-28f9-4c0d-b568-e7ee3d7ae643"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input: <start> hace mucho frio aqui . <end>\n",
      "Predicted translation: it s very cold here . <end> \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1fe712cf50>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "translate(u'hace mucho frio aqui.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 689
    },
    "colab_type": "code",
    "id": "zSx2iM36EZQZ",
    "outputId": "20ebea8d-d1c3-4609-f9f9-0806768c0d86"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input: <start> esta es mi vida . <end>\n",
      "Predicted translation: this is my life . <end> \n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAngAAAJ+CAYAAAAgzn0nAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmY13W99/H3MAwq0GggKAzuK2kIuONSDDcGFKuhJQpK\noF7KrRZaIOTSMaljHDXJMi2PhpWHozC4ccDIhUQlldAw0lS6GSZFEEcWBWbm/qPbuZ2GYZlBvr/f\nh8fjuryu4TvLec2nI/P0t8yvoKampiYAAEhGs6wHAACwYwk8AIDECDwAgMQIPACAxAg8AIDECDwA\ngMQIPACAxAg8AIDECDwAgMQIPACAxAi8PPDWW2/F8OHDY8mSJVlPAQDygMDLA9OnT4/nn38+Hnjg\ngaynAAB5QODluJqampg5c2aceeaZ8fDDD0dVVVXWkwCAHCfwctyzzz4ba9eujYkTJ0ZhYWE8+eST\nWU8CAHKcwMtxZWVl8aUvfSn22GOP+MpXvhIzZszIehIAkOMEXg5bt25dzJ49OwYOHBgREQMGDIgn\nnngi3n///YyXAQC5TODlsNmzZ8dnP/vZOO644yIionPnznHAAQfEI488kvEyAEjbunXrYsaMGfHB\nBx9kPaVRBF4OKysriwEDBtS5NmDAAHfTAsCn7LHHHovx48dHWVlZ1lMaReDlqIqKinjuuedq7579\nWP/+/eOVV16JN998M6NlAJC+GTNmxEEHHRQPPvhg1lMapaCmpqYm6xEAALli2bJl0adPn5g2bVqc\nddZZMX369Dj00EOznrVd3IKXw5YvXx4N9ffy5ct38hoA2DWUlZXFscceG507d44vfOELMX369Kwn\nbTeBl8N69eoVq1atqnf9vffei169emWwCADSV1ZWVuc3WDz00EMN3uCSqwReDqupqYmCgoJ619et\nWxe77bZbBosAIG0vvvhirFixIvr06RMREV/84hfjww8/jGeeeSbjZdunedYDqO+GG26IiIiCgoKY\nPHly7LHHHrXvq6qqikWLFsWRRx6Z1TwASNaMGTOitLQ0WrZsGRERLVq0iD59+sSDDz4Yp5xySsbr\ntp3Ay0FLliyJiH/egve3v/0tioqKat/XokWLOOqoo2LkyJFZzQOAJG3YsCEee+yxmDx5cp3rAwYM\niFGjRsXatWujVatWGa3bPp5Fm6Nqamri8ssvjxtvvDFat26d9RwASN6qVaviqaeeioEDB9Z7iFRZ\nWVn06NEj2rVrl9G67SPwclRVVVV06dIlysrK8u6p2QBAtjzJIkcVFhZGx44dY+PGjVlPAQDyjFvw\nctj06dPj4YcfjptuuinatGmT9RwASFJpaelmf2vF5vzud7/7lNfsGJ5kkcN++ctfxrJly+L000+P\nfffdt86zaSMiHnrooYyWAUA6zj333Nq3161bF3fffXd06dIlunbtGhERCxcujEWLFsUFF1yQ1cTt\nJvBy2Je+9KWsJwBA8j75mynGjRsXo0ePjosvvrjOx9xxxx3x2muv7expjeYuWgCA/6d79+4xffr0\nOOCAA+pcX7p0aQwePDhefPHFjJZtH0+yAAD4f1q2bBnPP/98vevPP/98vYdK5TJ30eawDRs2xM9+\n9rN45JFHYvny5bFp06Y673/11VczWgYAaRoxYkRcf/318fLLL9d5DN6MGTNizJgxGa/bdu6izWE3\n3XRTPPbYY3HhhRfGpEmT4oorrojy8vJ45JFH4vLLL4+vfe1rWU8EgOQ8+uijce+998Ybb7wREREH\nH3xwDB8+PPr165fxsm0n8HJYaWlpXHfddXH66adHt27doqysLPbff//49a9/Hc8++2z8+Mc/znpi\nTnvggQdqb/38198nmC9Pc4dd0erVq+Ppp5+OioqK2LBhQ5335dMtKJAld9HmsJUrV9a+ikWrVq2i\nsrIyIiJOO+20+NGPfpTltJx31113xc9//vM4++yzY8GCBXHOOefE0qVL449//KPX8YUctnDhwrjo\noouiqKgo3nvvvdhnn33inXfeiRYtWkRJSYnAY6eqrKyM6urqOtf22muvjNZsH4GXwzp06BDvvPNO\ndOzYMfbff/+YN29eHH300bFw4cLYfffds56X06ZNmxbf+973ok+fPjF16tQ499xzY7/99ouf/OQn\nsXz58qznAQ3493//9+jfv39MmDAhunfvHvfcc0/sscce8a1vfSu++tWvZj2PXUB5eXlce+218dxz\nz9V57HtNTU0UFBTkzePfBV4O6927d8yfPz+6du0aw4cPj7Fjx8Z//dd/xTvvvBPf+MY3sp6X0/7x\nj39Ely5dIiJi9913jzVr1kRExFe+8pUYOnRo3HDDDVnOAxqwZMmS+P73vx8FBQVRWFgYGzZsiP32\n2y+uvPLKuPLKK2PAgAFZTyRx48ePjw8++CBuvPHGaN++/Ta/wkWuEXg5bOzYsbVv9+nTJzp06BAv\nvvhiHHjggdGzZ88Ml+W+vffeO957773o2LFjdOzYMV566aXo3LlzLF26NG//ZYVdQVFRUe3bbdu2\njfLy8jjkkEOiVatW8c4772S4jF3Fyy+/HPfff38cfvjhWU9pEoGXwxYsWBDdunWL5s3/+T/TMccc\nE8ccc0xs2rQpFixYEMcff3zGC3PXSSedFHPnzo2jjjoqvvrVr8akSZPisccei8WLF0ffvn2zngc0\n4KijjoqXX345DjrooDjxxBPjlltuiZUrV8bMmTPjiCOOyHoeu4BOnTrVe3JPPvIs2hzWuXPnmDdv\nXrRt27bO9ffeey969OiRN48DyEJ1dXVUV1fXxvGjjz5ae+vn2WefXedWAiB3vPzyy7F27do46aST\nYtWqVfHtb3+79t/dSZMmiTw+dfPnz48777wzrr322nqvZpFPBF4OO/LII+OZZ56JNm3a1Ln+5ptv\nxplnnpk3L5eSheXLl0eHDh3q3R1bU1MTFRUV0bFjx4yWAZDLunXrFhs3boyqqqpo0aJFFBYW1nl/\nvvzsdRdtDvr4BY4LCgriqquuqnNrU3V1dbz22mvRrVu3rOblhV69em321s/Vq1dHr1693PoJwGZd\nc801WU/YIQReDvrsZz8bEf+8tam4uLjOr0QpKiqKY489NoYOHZrVvLzw8dPZ/9W6detit912y2AR\n0JDS0tJtfvKTX1LOp23w4MFZT9ghBF4OmjRpUkRElJSUxMiRI6Nly5YZL8ofH//6k4KCgpg8eXKd\nF4auqqqKRYsWxZFHHpnVPGAzzj333Nq3161bF3fffXd06dKlzuuALlq0KC644IKsJrKLeffdd6Os\nrCz+/ve/x+WXXx5t2rSJF154Idq3bx/77bdf1vO2icDLYZdcckmdP69YsSKeeOKJOOSQQ6J79+4Z\nrcptS5YsiYh/3oL3t7/9rc7d2y1atIijjjrKK1lAjvnkv5Pjxo2L0aNH1z5U5WN33HFHvPbaazt7\nGrugV155Jc4///zo1KlTvP766zFq1Kho06ZNPPPMM/HWW2/F5MmTs564TQReDrvwwgvjtNNOixEj\nRsTatWvjzDPPjPXr18e6devi+9//fgwaNCjriTnnV7/6VUT88xdVTpgwIVq3bp3xImB7zJ49O6ZP\nn17vep8+feKOO+7IYBG7mh/+8IcxfPjwuOyyy+o83v3UU0+NBx98MMNl20fg5bA///nPcdVVV0VE\nxJw5c6J169bxu9/9Lh566KH4xS9+IfC24OO7uT/24YcfxosvvhgHHHBAlJSUZLQqfzm/rZs9e3b0\n7NkzioqKYvbs2Vv82DPOOGMnrco/LVu2jOeff77er6d4/vnn6zzkAj4tf/7zn+PGG2+sd71du3bx\n7rvvZrCocQReDlu7dm0UFxdHRMS8efOid+/eUVRUFCeddFJ873vfy3hdbhs3blx8/vOfj2HDhsWG\nDRti6NCh8dprr0VRUVFMmTIlvvCFL2Q9Mac5v+132WWXxR/+8Ido27ZtXHbZZQ1+XD69lmUWRowY\nEddff328/PLLdR6DN2PGjBgzZkzG69gV7L777vH+++/Xe6zdG2+8Ue83M+QygZfDPn5psp49e8a8\nefPi1ltvjYiI999/v84za6lv3rx5cd5550VExNy5c2Pt2rXxhz/8IR544AGBsg2c3/b7y1/+stm3\n2T6jR4+OkpKSuPfee2PWrFkREXHwwQfHD37wg+jXr1/G69gV9OrVK6ZMmRI//vGPa68tW7YsfvSj\nH+XVre8CL4ddcMEF8e1vfztatmwZHTt2rH1psgULFuT9a+R92t5///3a/9J6+umn44wzzoi2bdtG\nv3794qc//WnG63Kf82u6FStWxEsvvRQrV66M6urq2usFBQVxzjnnZLgs9/Xr10/MkZnvfOc7MXr0\n6DjppJPiww8/jHPOOSdWrlwZ3bp1iyuuuCLredtM4OWwr33ta3H00UdHRUVF9OjRI5o1axYREfvv\nv39cfvnlGa/Lbe3atYu//vWv0a5du5g3b17tXdrr1q3zMmXbwPk1TVlZWUycODFqampizz33rPc7\n3gQe5K7WrVvHb37zm5g/f34sXrw4qqur46ijjooePXpkPW27CLwc9cEHH8SSJUviuOOOi6OPPrrO\n+z7zmc/EoYcemtGy/DBkyJD45je/Ge3bt4/CwsI4+eSTIyLiT3/6Uxx88MEZr8t9zq9pbrnllhg1\nalRceumlta+HTMO6d+8ejz/+eLRp0ya6deu2xV96nC8vE0V++uTP3pNPPrn2776IiBdeeCEOPfTQ\n2HPPPTNcuO38zZOjCgoKYvTo0XHXXXfFscceW3v91VdfjREjRsRTTz2V4brcN2bMmDj88MNj+fLl\n0bdv32jRokVERDRv3jxGjRqV8brc5/yaZs2aNTFkyBBxt42++93v1v5Ko1ReJor8lNLP3mZZD2Dz\n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\n6KKL4vvf/35ceumlcdBBB8WDDz4YgwYNiokTJ8aKFSvirLPOiocffjg2btxY7/N79uyZ4XcBAJCN\nnAy8Qw89NMaMGRP7779/nH/++fHZz342ioqK4rzzzov99tsvLr300qiuro6XXnopevfuHQUFBTFn\nzpzaz/84AgsLCzf79SsrK2PZsmV1/qmoqNhZ3x4AwA5RUVFRr2kqKyujedbDNueII46o8+e2bdvG\n4YcfXvvn5s2bx5577hkrV66MFi1axMCBA+OBBx6Ifv36xeuvvx4vv/xy/OAHP2jw699zzz0xZcqU\nOtdKSkpi7ty58avXbtux38wONnvDb7KekNfmVP1X1hPy1uPzJmY9Ia9d//myrCc07J2sB2zdrHd+\nlvWEvDZ7/dSsJ+StOdXTsp6wRcOGDYvy8vI618aMGZObgVdUVFTnzwUFBdG8efN616qrqyMiYujQ\noTFw4MD4xz/+Ef/93/8dXbt2jYMPPrjBrz9ixIgYPHhwnWsf39p33mH/O95e+u6O+DZ2uNkbfhNn\ntPh61jMaVFNVlfWELZpT9V/Ru/CsrGc0qObkLllPaNDj8ybG/zr1hqxnNOiUny7IesIWXf/5srj2\n5YFZz2jQc706ZD1hi2a987Po0/7irGc0qPqDNVlP2KLZ66fGGXucm/WMBtV89FHWExo0p3pa9G42\nNOsZm7XPAe1i6pu3x3333RdV//Lzt7i4ODcDb3sdeuih0aVLl7j//vvjoYceim9961tb/Pji4uIo\nLi7eSesAAD4dHTps/j/QcvIxeI0xdOjQuOuuu2L9+vXRt2/frOcAAGQm5wKvoKCgUZ/Xr1+/KCoq\nin79+kXLli138CoAgPyRc3fR3nvvvfWuPfTQQ/WuzZs3r86f33///fjoo4/iq1/96qe2DQAgH+Rc\n4G2vTZs2xTvvvBM333xzfO5zn4uuXbtmPQkAIFM5dxft9nrxxRejtLQ0XnnllXqvaAEAsCvK+1vw\nTjjhhPjLX/6S9QwAgJyR97fgAQBQl8ADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiM\nwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMAD\nAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBI\nTPOsB+Samk1VUbNpU9YzGpTL2/JCTU3WCxpU8Myfsp6wRbm877n/VZL1hC17O7c3dnh4fdYTtqrD\nwx9lPaH9Dw8NAAAQtklEQVRBS27qmvWErVrzldzd2OqB57KekCS34AEAJEbgAQAkRuABACRG4AEA\nJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG\n4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuAB\nACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkJicDb/z48XHxxRfXezsioqamJq655po48cQTo3Pn\nzrFgwYKsZgIA5KTmWQ/YmgkTJtT585NPPhnTp0+PqVOnRqdOnWLPPffMaBkAQG7K+cBr3bp1nT+/\n9dZb0a5duzjmmGMyWgQAkNty8i7aTxo3blydu2t/8IMfREVFRRx55JHRq1ev2o+78847o3fv3nHM\nMcfEgAEDYubMmVlNBgDIVM7fgldQUFD79oQJE6Jjx47x4IMPxgMPPFD7vptvvjlmz54d1113XRx4\n4IGxcOHCmDhxYuy5557xhS98IavpAACZyPnA+6TWrVtHq1atolmzZtGmTZuIiFi/fn3853/+Z/zy\nl7+MY489NiIiSkpK4k9/+lP8+te/FngAwC4nrwJvc15//fX46KOPYtSoUXWuV1VVRadOnTb7OZWV\nlVFZWVnnWmFhYXTo0OFT2wkAsKNVVFREVVVVnWvFxcX5H3g1NTUREXHHHXfUC7TmzTf/7d1zzz0x\nZcqUOtdKSkpi7ty5MfXN2z+doTvInOppWU/Ia86v8Zxd08x6O7f/bsl1d59wd9YTGpYH/2o8M+3K\nrCfkrVz/u2/YsGFRXl5e59qYMWPyP/AOOeSQaNGiRZSXl8cJJ5ywTZ8zYsSIGDx4cJ1rhYWFERFx\n7kGXxNtLV+zwnTvCnOpp0bvZ0Kxn5C3n13i5fnaF7dplPWGLZr19e/TZ55KsZzSow0Prs56wRXef\ncHdc8PwFWc9o0JKbjsp6whY9M+3K6DH0R1nPaFCrB57LekKDcvnvvn0OaBdT37w97rvvvjRvwWvV\nqlWMHDkyfvjDH0Z1dXUcf/zxsW7duli4cGEUFhbG0KH1/4cpLi6O4uLiDNYCAOw4DT28LGcD75PP\nnt2aK664Itq1axd33313XH/99dG6devo3LlzvcflAQDsCnIy8CZNmrTZtyMiRo4cGSNHjqz3OcOG\nDYthw4Z96tsAAHJdzv+iYwAAto/AAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMAD\nAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBI\njMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzA\nAwBIjMADAEiMwAMASIzAAwBITPOsBwA0VdWKFVlP2Kpc3lhx3sFZT9iyJREV57XPekWDrp91V9YT\ntuLKuP7fc3fjfzz7pawnbFHzko5ZT9iswn3bbPH9bsEDAEiMwAMASIzAAwBIjMADAEiMwAMASIzA\nAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMA\nSIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiM\nwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASEzzrAdkobKy\nMiorK+tcKywsjA4dOmS0CABg+1VUVERVVVWda8XFxVFQU1NTk9GmzNx2220xZcqUOtdKSkpi7ty5\nGS0CANh+paWlUV5eXufamDFjds3A29IteOcedEm8vXRFRsu2bE71tOjdbGjWM/KW82s8Z9c0uX5+\nhYcdnPWELZq15IfR54jvZD2jQWNnlWU9YYt6H/SXmPPmkVnPaNB/nP6lrCc06LH/c2v03e/yrGds\nVvtObeKe+dc2eAtesnfRTp06Ne6777547LHH6r2vuLg4iouLM1gFALDjNPTwsmSfZLF69epYunRp\n1jMAAHa6ZANvzJgxsXjx4qxnAADsdMkGHgDArkrgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEA\nJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG\n4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuABACRG4AEAJEbgAQAkRuAB\nACRG4AEAJEbgAQAkRuABACRG4AEAJKZ51gMAyFbVa29kPWGrcnnjf5zaO+sJW9S7PLc3PvLCo1lP\n2IJb45EFObqvsCQirm3w3W7BAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiM\nwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMAD\nAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBIjMADAEiMwAMASIzAAwBI\njMADAEiMwAMASEzeBN4vf/nLKC0tzXoGAEDOy5vAi4goKCjIegIAQM7bIYG3Zs2a+OCDD3bEl9pm\nq1atig0bNuzU/5sAAPmg0YFXXV0dTz/9dIwdOzZOO+20WLJkSUT8M/a++93vRo8ePaJ79+5x3nnn\nxSuvvFL7edOnT49u3brF/Pnzo3///tGtW7cYPnx4lJeX1/n6d955Z5x66qnRvXv3GDduXKxbt67O\n+5966qk45ZRT4pprrokXX3yxsd8GAEBytjvwXnvttbjpppvii1/8YowdOzZatWoVd911Vxx33HER\nETF69OhYsWJF/PznP4+ysrI4/vjj4/zzz49333239mts3Lgx7rzzzpg0aVLcf//98cEHH8S1115b\n+/5HH300br311rj88stj+vTpceCBB8bdd99dZ8fAgQNj8uTJsXbt2vjGN74RZ5xxRvzkJz+JZcuW\nNfYsAACS0HxbPmj16tUxc+bMKCsri7/+9a9x2mmnxcSJE6Nnz55RVFRU+3Hz58+PJUuWxLPPPhst\nWrSIiIjLLrss5s6dG2VlZfGNb3wjIiKqqqri2muvjQMOOCAiIkaOHBlXX3117de59957Y8iQITF0\n6NCIiLj44ovjueeei7///e+1H1NQUBCnn356nH766bFu3bqYNWtWlJWVxU9/+tPo1q1bDBo0KPr2\n7RstW7as9/1UVlZGZWVlnWuFhYXRoUOHbTo0AIBcUFFREVVVVXWuFRcXb1vgTZ06NaZMmRLdu3eP\n2bNnNxhCixcvjvXr18eJJ55Y5/rGjRvrxFmLFi1q4y4ion379rFp06aorKyM4uLieOONN+Kss86q\n8zW6du1a52t8UsuWLWPIkCExZMiQePXVV2Ps2LExceLEKCwsjEGDBtX7+HvuuSemTJlS51pJSUnM\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1f59bc8fd0>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "translate(u'esta es mi vida.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 619
    },
    "colab_type": "code",
    "id": "A3LLCx3ZE0Ls",
    "outputId": "976d558e-78f6-4f5f-9971-a3379ee8f3fd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input: <start> ¿ todavia estan en casa ? <end>\n",
      "Predicted translation: are you still home ? <end> \n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAngAAAI4CAYAAAD5z5RWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4lFXC/vE7mRTqoEiAECDSFDasEEDEiIKJxIB0RXxF\nqqAuolJc+pLooohKUWKFd5G6CqshsEhWXoICAgoiIsVIUZAQAWkBAhIm8/uDHyPjBNcCnCcn3891\n7XXNnGfKPWdx5s5Tg7xer1cAAACwRrDpAAAAALi0KHgAAACWoeABAABYhoIHAABgGQoeAACAZSh4\nAAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAAAJah4DnMt99+qx49eigrK8t0FAAAUERR8BwmLS1N\nn376qd59913TUQAAQBEV5PV6vaZD4Byv16v4+HjFxcVp+fLlWrlypVwul+lYcLCDBw8qPz/fb6xK\nlSqG0gAAnCLEdAD8ZO3atTp58qRGjx6tFStW6KOPPlJ8fLzpWHCY48ePa+zYsVqyZElAuZOkbdu2\nGUgFAHASNtE6SHp6uu68806VLFlSbdu21YIFC0xHggONHz9eX331lV555RWFh4drwoQJGjp0qCpX\nrqxJkyaZjgcAcADW4DlEXl6ePvjgA7355puSpPbt26tr1646duyYypUrZzgdnGTFihWaOHGimjRp\nouDgYMXExKhNmzaKiIjQO++8o6SkJNMRAQCGsQbPIT744ANdffXVatKkiSSpXr16io6O1uLFiw0n\ng9McP37ct59d2bJldfToUUlSw4YN9fnnn5uMBgBWy8vL04IFC3T8+HHTUf4rCp5DpKenq3379n5j\n7du3ZzMtAlSrVk3fffedJKlWrVpavHixvF6vli5dytpeALiMlixZohEjRig9Pd10lP+KgucAOTk5\n+uSTT9ShQwe/8Xbt2mnz5s365ptvDCWDE3Xu3Nl3nsR+/frpnXfeUf369fX888+rX79+htMBgL0W\nLFigGjVq6L333jMd5b/iNClAEbdv3z5t3rxZ0dHRuv76603HAQAr7d27V0lJSZo/f77uvfdepaWl\nqXbt2qZjXRRr8Bxi3759uljX3rdv3xVOg6KkSpUqSkxMpNwBwGWUnp6uxo0bq169emrRooXS0tJM\nR/pFrMFziHr16mnVqlW65ppr/MaPHDmiuLg4zm1WzE2fPl3333+/wsPDNX369F98bO/eva9QKgAo\n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\ncDo4SYkSJZSSkqKhQ4dqz549kqTq1asX+/03hw8frj//+c/q1q2bzpw5oy5dumj79u0KDQ1Vamqq\nWrRoYTqiEc8884xatmypQYMGFetL2V3ozJkzev3117V48WLt27fP79qikii9CFCiRAkdO3YsYF+7\nXbt2BRy57xTsg+cQ5y9NlpeXp1WrVikuLk6SdOzYMS5+jUK5XC4FBwfL5XIFnJOpOFq1apXvagSZ\nmZk6efKkPv74Yz322GNKTU01nM6c7Oxs9e/fn3J3gZdeekkLFixQ7969FRwcrKFDh6pbt2666qqr\nlJycbDoeHCghIUGpqal+V7PYu3evXnzxRcfu5kDBc4jevXtr6NChatGihSpVquS7NNm6deuK9akv\nEOjs2bMaP368brzxRnXo0EHt2rXTjTfeqOeff175+fmm4xlz7Ngx31/SK1euVGJioq655hq1adNG\nO3bsMJzOnEaNGumbb74xHcNRlixZopSUFN13330KDg5WQkKCRo8erccee0yrV682HQ8ONGzYMB07\ndkzNmjXT6dOndf/99ysxMVFly5bVwIEDTccrFJtoHeK+++5T/fr1lZOTo7i4OAUHn+ve1atX1xNP\nPGE4HZzkhRde0OLFi/XUU0+pcePGkqT169dr4sSJ8nq9xXY/vIiICH399deKiIjQqlWrfLs25OXl\nFevLlN13330aP368Dhw4oOuuu853KbfzYmJiDCUz59ChQ6pdu7YkqXTp0srNzZUk3XrrrXrxxRdN\nRoNDlSlTRv/85z+1Zs0abd26VQUFBYqJifFtbXMiCp4DHD9+XFlZWWrSpInq16/vt6xs2bK+LyJA\nkv7973/r2Wef9dunrHr16ipfvrxGjx5dbAte586dNWjQIFWsWFEul0s333yzpHNHGNesWdNwOnMe\nf/xxSdLf/va3gGXF9SCLyMhIHThwQFWqVFH16tW1atUq1a9fXxs3bmSXGAS48Df65ptv9n23SNJn\nn32m2rVrq1y5cgYTFo6C5wBBQUHq16+fpk2b5lsjI53b0bdnz55asWKFwXRwmuPHjxd6Us1q1ar5\n1kQURwMGDNB1112nffv2qXXr1goLC5MkhYSEqG/fvobTmbNs2TLTERynVatWWrNmjRo2bKgePXpo\nyJAhmjdvng4cOMClyhCgqP5Gsw+eA5QpU0bx8fFKT0/3G1+4cKGaN2+u8uXLG0oGJ6pbt65mzZoV\n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\nNqxjFN4a+gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1f59bc8110>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "translate(u'¿todavia estan en casa?')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "height": 713
    },
    "colab_type": "code",
    "id": "DUQVLVqUE1YW",
    "outputId": "cd70c713-beff-43b3-9f30-54b0f81fd0dd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input: <start> trata de averiguarlo . <end>\n",
      "Predicted translation: try to figure it out . <end> \n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAewAAAKWCAYAAACLe6paAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X2YzPXi//HX7Ows1p7Fyu2yRGW1teUmad1U65Cb3JY6\nJ3eHvoSotN1Y67QpZSXRsaejr06O2E66sbaOiEJRHHc/bSEJWbYNiVYWeze/P3xNph0Sy/vzXs/H\ndbmu2ffMzr7mfbnmNe/P3bi8Xq9XAADA0YJMBwAAAL+NwgYAwAIUNgAAFqCwAQCwAIUNAIAFKGwA\nACxAYQMAYAEKGwAACwSbDgAApen48ePatWuXXC6XoqKiVK5cOdORgFJBYQMoEwoLCzV58mSlpaWp\noKBAXq9XISEh6tu3r0aNGiWPx2M6InBeKGwAZcKkSZO0YMECjRs3Ts2aNZMkrVu3Ti+88IK8Xq8e\nf/xxwwmB8+PiWuIAyoJWrVrp2Wef1c033+w3vnz5co0dO1YrV640lAwoHRx0BqBMOHz4sOrWrVti\nvG7dusrNzTWQCChdFDaAMiE6OlqzZ88uMf7aa6+pcePGBhIBpYtN4gDKhLVr12rIkCGqXr26rr/+\nerlcLv2///f/tG/fPs2YMUPNmzc3HRE4LxQ2gDJj7969ev3117Vjxw55vV41bNhQ99xzj2rUqGE6\nGnDeKGwAACzAaV0ArLVp06azfmxMTMwFTAJceKywAVgrOjpaLpdLv/U25nK5tGXLlouUCrgwKGwA\n1srOzj7rx0ZGRl7AJMCFR2EDsF5BQYGmTJmiPn36UMwoszgPG4D1PB6P/v3vf//mpnHAZhQ2gDKh\ndevWWr16tekYwAXDUeIAyoSWLVtqypQp2rp1q2JiYhQaGup3f4cOHQwlA0oH+7ABlAnR0dGnvY+j\nxFEWUNgAAFiAfdgAAFiAfdgAyoxDhw5pxYoVysnJUX5+vt99I0aMMJQKKB1sEgdQJmzcuFH33Xef\nPB6PDh48qBo1amjfvn0KCQlRZGSk3nvvPdMRgfPCJnEAZcJzzz2nrl27asWKFQoJCdGsWbO0fPly\nXXPNNRo8eLDpeMB5o7ABlAlbt25Vnz595HK55Ha7lZ+fr8suu0yPPPKIUlNTTccDzhuFDaBM8Hg8\nvttVq1b1XWe8YsWK2rdvn6lYQKnhoDMAZUJMTIy++OILXX755brxxhs1depUHThwQO+++64aNWpk\nOh5w3jjoDECZ8MUXX+jIkSNq2bKlfvzxRz322GPasGGD6tevrwkTJlDasB6F7TDffvutnnjiCSUl\nJfEGAwDwYR+2w6Snp2vNmjV65513TEcBADgIK2wH8Xq9io+PV1xcnJYtW6YVK1bI7XabjgVYoWvX\nrme8n/OwYTsOOnOQ1atX68iRIxo7dqw++eQTffzxx4qPjzcdC7DCbbfd5vdzQUGBvvrqK23YsEH3\n3HOPoVRA6aGwHSQjI0O33XabKlSooNtvv13z58+nsIGzdLpLj77yyiv67rvvLnIaoPSxD9sh8vLy\ntHjxYnXv3l2S1K1bNy1fvlw//fST4WSA3Tp06MDmcJQJFLZDLF68WFWqVFHz5s0lSY0bN1a9evW0\nYMECw8kAu61du1bly5c3HQMOlZeXp/nz5+vw4cOmo/wmNok7REZGhrp16+Y31q1bN82fP5/9b8BZ\nGDp0aImxffv2acuWLbr//vsNJIINFi5cqLFjxyopKUl9+/Y1HeeMOErcAXJyctSuXTu9//77ql+/\nvm/8+++/V3x8vBYsWKDLL7/cXEDAAomJiX4/u1wuRUREqGXLlmrdurWhVHC6fv366cCBAypfvrzm\nzZtnOs4ZUdgAgEvSnj171LFjR7311lu66667lJ6eriuuuMJ0rNNiH7ZDfPfddzrdZyeOcAWA0peR\nkaFmzZqpcePGuvnmm5Wenm460hmxwnaIxo0ba+XKlapatarf+MGDBxUXF6ctW7YYSgbYIT4+Xi6X\nq8S4y+VSuXLlFBUVpTvvvFPt2rUzkA5O1KFDBw0dOlS9evXS4sWLNX78eH388ccB/x85AStsh/B6\nvQH/k+Tl5alcuXIGEgF26dWrl3766SfVr19f3bp1U7du3VS/fn399NNPio+Pl9vt1siRIznzApKk\nDRs2aP/+/erYsaMk6ZZbbtGxY8f02WefGU52ehwlbtj48eMlnVgFTJ48WRUqVPDdV1RUpMzMTEVH\nR5uKB1hjz549GjJkiIYMGeI3PmPGDG3fvl2pqamaPn26ZsyYoS5duhhKCac4eWGq0NBQSVJISIg6\nduyoefPmqVWrVobTBcYK27CtW7dq69at8nq92r59u+/nrVu3KisrSzExMUpJSTEdE3C8xYsXl7g8\nqXRis+fixYt9t3ft2nWxo8Fh8vPztXDhQt+Fqk7q1q2bPvroIx05csRQsjNjhW3Y7Nmz5fV69eCD\nD+rZZ59VWFiY6UiAlSpUqKB169apXr16fuPr1q3zbbkqLi5mFxP0888/KykpSW3atPEbb968ucaN\nG6e8vDxVrFjRULrTo7AdoLi4WB999JG+//57R59SADhZ//79NW7cOH355Ze69tpr5XK5lJmZqfT0\ndA0fPlyStGLFCjVu3NhwUpgWERGhHj16BLzv16tuJ+EocYdo3769/va3v/FmApyHBQsWaPbs2dqx\nY4ckqUGDBurfv786d+4sSTp27JjvqHHANhS2Q6Snp+s///mPJk2apIiICNNxAKDMOd2pf4F89NFH\nFzjN78cmcYd49dVXtWfPHrVt21Y1a9b0O1pcEt82BADn6dRrhefl5WnmzJmKjY3V9ddfL0nauHGj\nMjMzNXDgQFMRz4jCdohAR7cCOLOmTZvqww8/VEREhJo0aXLG1dOGDRsuYjI40aBBg3y3R48ercGD\nB5f40piXX35Z27Ztu9jRzgqbxOFoq1ev1oIFC/Tdd9+poKDA777XXnvNUCo4RXp6urp06aKQkJDf\nvKxkz549L1Iq2KBp06ZKT08vcVbBrl271LNnT0d+wGOFDceaN2+ekpOT1b59e61Zs0bt2rXTt99+\nqz179pT4KlJcmk6WcGFhoSIiIhQbG6sqVaoYTgUbhIaGas2aNSUKe82aNSV2SToFhe0Q+fn5mj59\num81WVhY6Hf/pXgt8VdffVVPPPGEevfurSZNmighIUF169bVU0895bs6ESBJwcHBGjFihBYuXEhh\n46wMGDBA48aN0xdffOG3D3v+/PkaMWKE4XSBcaUzh3jxxRc1f/58DRw4UEFBQXrsscfUp08fVa5c\nWcnJyabjGbF7927ddNNNkk5cNvDk1Yf69Onj+G/VwcUXHR2trKws0zFgicGDB+u5557T119/rZSU\nFKWkpPhu//rytk7BCtshFi5cqCeffFJt27bVxIkT1a5dO0VFRalBgwb67LPP9Kc//cl0xIuucuXK\nvpKuUaOGtm3bpujoaB06dEjHjh0znA5OM2LECKWkpOiBBx5QTExMic2alStXNpQMTtW5c2ffOfo2\noLAd4sCBA76rnFWsWFG5ubmSpDZt2uj55583Gc2Y5s2b69NPP1WjRo3UqVMnjR8/Xp999plWrVrl\n2Ivzw5z77rtP0oniPvVo8ZPfhHcp7lbC2cnNzVVxcbHfmBM/4FHYDlGrVi3t27dPtWvXVlRUlFau\nXKlrrrlGGzduVPny5U3HM+Kvf/2rjh8/LunEm7Hb7daGDRvUqVMnDRs2zHA6OA1nDeD3yM7OVnJy\nsv773//6HTPk5A94nNblEJMnT1ZoaKiGDRumRYsWKSEhQTVq1NC+fft07733atSoUaYjAkCZ0b9/\nfx0+fFiDBg1S9erVS5zD36JFC0PJTo/CdqjPP/9cGzZsUP369XXrrbeajmNE48aNtXLlSlWtWtVv\n/ODBg4qLi3PkJ2CYtXXrVs2dO1dZWVl69tlnVb16dX344YeqXbu2rr76atPx4CBNmjTR3LlzddVV\nV5mOctY4Stwh1q5d67dZ5rrrrtPAgQPVpk0brV271mAyc073WTI/P18ej+cip4HTrVy5Unfeeaf2\n7t2r1atX+3anZGVlKTU11XA6OE2dOnWUn59vOsbvwj5sh+jfv3/A1eThw4fVv3//S2o1OXPmTEmS\ny+XSv//9b7/vpS0qKtK6devUoEEDU/HgUC+++KJGjx6tPn36qEmTJr7xFi1a6NVXXzWYDE40ZswY\nvfDCC0pOTi5x8RSnorAd4uSBDr926NAhx15150KZPXu2pBNz8vbbbyso6JcNQR6PR3Xq1NG4ceNM\nxYNDffPNN7r55ptLjFeqVEk//fSTgURwsuHDh6ugoEAdO3ZUSEiI3G633/1cmhQlnLzwvMvl0qOP\nPuq3qbe4uFjbtm3zWy1cCpYuXSpJ6tevn1JTU1WpUiXDiWCD8PBw7d27V3Xq1PEb37x5s2rWrGko\nFZzqiSeeMB3hd6OwDTt5GUWv16vw8HC/U7g8Ho+aNWum3r17m4pn1MmVNnA2br/9dk2aNElTp06V\ny+VSYWGh1qxZo4kTJ6pXr16m48FhbPwyGI4Sd4jU1FQNGjSIa2T/ys6dO/XBBx8E/LauCRMmGEoF\nJyooKNDo0aP1/vvvy+v1KigoSF6vV7fffrtSUlJKbPIEfvjhB2VkZCgrK0sPPvigIiIitH79elWv\nXl1169Y1Ha8ECtshTl5l5+T+2v3792v58uVq2LChmjZtajKaMcuXL9fIkSN19dVXa9OmTbrmmmu0\ne/du5efnq1mzZpo+fbrpiHCgrKwsbd68WcXFxbr66qtVv35905HgQF9++aX+8pe/qE6dOvrmm2+0\ncOFC1a1bV9OmTdO3336ryZMnm45YAqd1OcSQIUN8m4CPHDmiO+64Q88995z69eun+fPnG05nxt/+\n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\ngTEvgdkwL/8fY49g7ilhh60AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1f5711f250>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# wrong translation\n",
    "translate(u'trata de averiguarlo.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "RTe5P5ioMJwN"
   },
   "source": [
    "## Next steps\n",
    "\n",
    "* [Download a different dataset](http://www.manythings.org/anki/) to experiment with translations, for example, English to German, or English to French.\n",
    "* Experiment with training on a larger dataset, or using more epochs\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "name": "nmt_with_attention.ipynb",
   "toc_visible": true,
   "version": "0.3.2"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
